const xml2js = require("xml2js");
const path = require("path");
const fs = require("fs");

function getBookBasicInfo(metadata) {
  return {
    title: metadata["dc:title"][0],
    author: metadata["dc:creator"][0],
    date: metadata["dc:date"][0],
    language: metadata["dc:language"][0],
    ISBN: metadata["dc:source"][0],
    publisher: metadata["dc:publisher"][0],
    description: metadata.description[0]["_"],
  };
}

function getCatalogue(guide) {
  //   console.log(guide, "guide");
  // for (const item of guide.reference) {
  //   console.log(item["$"], "-------");
  // }
}

class EpubBook {
  constructor(IBook) {
    this.book = {
      metadata: {
        title: "",
        author: "",
        language: "",
        ISBN: "",
        description: "", //   简介
        publisher: "", //出版商
      },
      manifest: {},
      spine: {},
      guide: {},
    };
    this.parseFilePromise = this.parseFile(IBook);
  }

  async parseFile(epubFilePath) {
    return new Promise(async (resolve, reject) => {
      // 读取并解压 EPUB 文件
      const parser = new xml2js.Parser();
      try {
        // 使用 fs.createReadStream 读取 EPUB 文件
        //   const input = fs.createReadStream(epubFilePath);
        //   const input = fs.createReadStream(
        //     path.resolve(__dirname, "../file/erlang-book-part1.epub")
        //   );

        // 使用 unzipper 解压 EPUB 文件
        //   await input.pipe(unzipper.Extract({ path: "output/epub" })).promise();

        // console.log("EPUB 文件解压完成------------");

        // 读取 OPF 文件（通常位于 META-INF/container.xml 中指向的路径）
        const containerPath = path.join(
          "Wordslut.epub",
          "META-INF",
          "container.xml"
        );

        const containerXml = fs.readFileSync(containerPath, "utf8");

        // 解析 container.xml
        const result = await parser.parseStringPromise(containerXml);

        // 获取 OPF 文件的路径
        const rootfiles = result.container.rootfiles[0].rootfile;
        const opfPath = path.join("Wordslut.epub", rootfiles[0].$["full-path"]);

        // 读取 OPF 文件
        const opfXml = fs.readFileSync(opfPath, "utf8");

        // 解析 OPF 文件
        const opfResult = await parser.parseStringPromise(opfXml);
        // 假设 opfData 是你从文件中读取并解析得到的对象

        // 获取元数据数组中的第一个对象（通常只有一个元数据对象）
        const { metadata, manifest, spine, guide } = opfResult.package;
        this.book.metadata = getBookBasicInfo(metadata[0]);
        this.book.manifest = manifest[0];
        this.book.spine = spine[0];
        this.book.guide = guide[0];
        getCatalogue(this.book.guide);
        // console.log("解析成功 filepath:", opfPath);
        resolve(true);
      } catch (error) {
        // console.error("读取或解压 EPUB 文件时出错:", error);
        reject(false);
      }
    });
  }
  async getBasicInfo() {
    await this.parseFilePromise;
    return this.book.metadata;
  }

  getCatalogue(self) {}

  getPageCount(self) {}

  getPage(self, pageNum) {
    return Page(pageNum);
  }
}

module.exports = EpubBook;
